main: Push the current event on the stack before we start needing it
authorRui Matos <tiagomatos@gmail.com>
Fri, 5 Jun 2015 17:21:40 +0000 (19:21 +0200)
committerRui Matos <tiagomatos@gmail.com>
Mon, 8 Jun 2015 12:23:19 +0000 (14:23 +0200)
The changes in commit 13e22e20300b7312e52bba7d077fc7e231695fc1 made
_gtk_window_check_handle_wm_event() indirectly depend on
gtk_get_current_event_time() which relies on the current event being
available on the current_events stack.

Since the current event is only pushed on the stack afterwards we get
an invalid timestamp which breaks ewmh window moving.

This fixes the issue by pushing the current event before we start
relying on it being there in gtk_main_do_event() and, as a byproduct,
also fixes a potential memory leak when we have a rewritten event and
return early due to _gtk_window_check_handle_wm_event() being TRUE.

https://bugzilla.gnome.org/show_bug.cgi?id=750384

gtk/gtkmain.c

index 2907db7383d00493ced312aaf9d92e3e66b45997..35b0fa235ddacc210f0c8b53539f850bd460655b 100644 (file)
@@ -1567,6 +1567,11 @@ gtk_main_do_event (GdkEvent *event)
       event_widget = gtk_get_event_widget (event);
     }
 
+  /* Push the event onto a stack of current events for
+   * gtk_current_event_get().
+   */
+  current_events = g_list_prepend (current_events, event);
+
   window_group = gtk_main_get_window_group (event_widget);
   device = gdk_event_get_device (event);
 
@@ -1582,7 +1587,7 @@ gtk_main_do_event (GdkEvent *event)
        !gtk_widget_is_ancestor (event_widget, grab_widget)))
     {
       if (_gtk_window_check_handle_wm_event (event))
-        return;
+        goto cleanup;
     }
 
   /* Find out the topmost widget where captured event propagation
@@ -1607,17 +1612,7 @@ gtk_main_do_event (GdkEvent *event)
    */
   if (device &&
       _gtk_window_group_widget_is_blocked_for_device (window_group, grab_widget, device))
-    {
-      if (rewritten_event)
-        gdk_event_free (rewritten_event);
-
-      return;
-    }
-
-  /* Push the event onto a stack of current events for
-   * gtk_current_event_get().
-   */
-  current_events = g_list_prepend (current_events, event);
+    goto cleanup;
 
   /* Not all events get sent to the grabbing widget.
    * The delete, destroy, expose, focus change and resize
@@ -1793,6 +1788,7 @@ gtk_main_do_event (GdkEvent *event)
       _gtk_tooltip_handle_event (event);
     }
 
+ cleanup:
   tmp_list = current_events;
   current_events = g_list_remove_link (current_events, tmp_list);
   g_list_free_1 (tmp_list);